<?
/**
 * Файл с функциями-инструментами.
 */

/**
 * Обертка для print_r с мультизначением в виде системного сообщения
 */
function dump() {
    print "<div class='message system'>DUMP:<br />";
    foreach (func_get_args() as $arg) {
        print "<pre style='overflow: auto; z-index: 1001 !important; text-align: left !important; background: #000 !important; color: #0a0 !important; padding: 1ex !important; margin: 1ex !important; border: 1px solid #900 !important'>";
        print_r($arg);
        print "</pre>";
    }
    print "</div>";
}

/**
 * Обертка для print_r с мультизначением
 */
function d() {
    foreach (func_get_args() as $arg) {
        print "<pre style='overflow: auto; z-index: 1001 !important; text-align: left !important; background: #000 !important; color: #0a0 !important; padding: 1ex !important; margin: 1ex !important; border: 1px solid #900 !important'>";
        print_r($arg);
        print "</pre>";
    }
}

/**
 * Переводит строку при наличии ее в переменной $GLOBALS['MESS']
 * 
 * @param string $str непереведенная строка с позициями замены
 * @param array $replacers массив позставляемых значений
 * @return string переведенная строка
 */
function t($str, $replacers = array()) {
    if (isset($GLOBALS['MESS'][$str]))
        $str = $GLOBALS['MESS'][$str];
    if (!empty($replacers)) {
        foreach ($replacers as $pattern => $replace) {
            $str = str_replace($pattern, t($replace), $str);
        }
    }
    return $str;
}

/**
 * Подключение файла с классом
 * 
 * @param str $name Имя класса (файл должен оканчиваться на .class.php)
 * @param str $dir Путь к директории
 * @return boolean файл класса подключен
 */
function IncludeClass($name, $dir = "/") {
    $exists = false;
    if (file_exists("$dir/$name.class.php")) {
        require_once "$dir/$name.class.php";
    }
    return $exists;
}

/**
 * Получение строки запроса в _GET
 * 
 * @param array $params параметры подстановки
 * @return type
 */
function getQueryString($params = array()) {
    $get = $_GET;
    $getStr = array();
    $array = array();

    foreach ($params as $key => $param) {
        if (isset($get[$key]))
            unset($get[$key]);
        $array[] = "$key=$param";
    }


    foreach ($get as $key => $val) {
        $getStr[] = "$key=$val";
    }

    $getStr = array_merge($getStr, $array);
    return "?" . implode("&", $getStr);
}

/**
 * 
 * @param str $path путь
 * @return str URI 
 */
function pathToUri($path) {
    $path = str_replace("\\", "/", $path);
    return str_replace(ROOT_DIR, "", $path);
}

/**
 * вставка невидимого поля с идентификатором сессии
 */
function check_session() {
    print "<input type=\"hidden\" name=\"session_id\" value=\"" . session_id() . "\">";
}

/**
 * вставка невидимого поля с идентификатором действия
 *  * @param str $action идентификатор действия
 */
function set_action($action) {
    print "<input type=\"hidden\" name=\"action\" value=\"$action\">";
}

/**
 * Проверка поля действия формы
 * 
 * @param str $action идентификатор
 * @param str $type метод запроса формы post|get|[NULL]
 * @return boolean идентификатор соответствует полученному 
 */
function check_action($action, $type = false) {
    $ok = false;
    switch ($type) {
        case 'get':
            $ok = (isset($_GET['action']) && $_GET['action'] == $action);
            break;
        case 'post':
            $ok = (isset($_POST['action']) && $_POST['action'] == $action);
            break;
        default : $ok = (isset($_REQUEST['action']) && $_REQUEST['action'] == $action);
    }
    return $ok;
}

/**
 * Рекурсивно превращает плоский массив в древовидный со вложенными итерациями
 * 
 * @param array $data Входящий плоский массив
 * @param str $key_name ключ сравнения
 * @param str $pid_name ключ предка
 * @param str $clildren_array_name название подмассива
 * @param mixed $pid значение текущего ключа предка
 * @param boolean $use_empty Получить результат для пустых значений потомков
 * @return array результирующий древовидный массив
 */
function Tree($data, $key_name, $pid_name, $clildren_array_name, $use_empty = false, $pid = 0) {
    
    $result = array();
    if (!empty($data)) {
        foreach ($data as $index => $element) {
            if ($element[$pid_name] == $pid) {
                unset($data[$index]);
                $children = Tree($data, $key_name, $pid_name, $clildren_array_name, $use_empty, $element[$key_name]);
                if (!empty($children)) {
                    $element[$clildren_array_name] = $children;
                }elseif($use_empty == true){
                    $element[$clildren_array_name] = array();
                }
                $result[] = $element;
            }
        }
    }
    return $result;/**/
}
